-- Jednostka arytmetyczno-logiczna
-- Wejscia danych:
-- X(7..0)
-- Y(7..0)
-- Wyjscia danych:
-- ALUOUT(7..0) (wynik operacji arytmetycznej) 
-- Wejscia sterujace:
-- INSTR(1..0) (rodzaj instrukcji)
-- OE# (output enable)
-- START# (start obliczen)
-- Wyjscia sterujace:
-- FLAGOUT(3..0) (wyjscie do rejestru flag)
-- FLAGW (ustawianie flag)

library IEEE;
use IEEE.Std_Logic_1164.all;
use IEEE.Std_Logic_Arith.all;
use work.constants.all;

entity ALU2 is
  generic (delay : time := 5 ns);
  port (X, Y      : in std_logic_vector(7 downto 0);
        INSTR     : in std_logic_vector(1 downto 0);
        OE, START : in std_logic;
        ALUOUT    : out std_logic_vector(7 downto 0);
        FLAGOUT   : out std_logic_vector(3 downto 0);
        FLAGW     : out std_logic);
end entity ALU2;

architecture ALU_arch of ALU2 is
signal buf: std_logic_vector(7 downto 0);
begin
  NEG_INSTR : entity work.neg_instr 
      port map(
             din     => X,
             dout    => buf,
             flagi   =>FLAGOUT
              );
  process(OE)
  begin
    if (OE ='0') then
            ALUOUT<=buf;
       else ALUOUT <= "ZZZZZZZZ";
    end if;
    
  end process;
end architecture ALU_arch;


